<script setup>
// 1.__proto__原型，只要是对象就有
// // __proto__ 为对象的原型，默认一般为空，rabbit.__proto__这里是指向
// //  JavaScript 会顺着 [[Prototype]] 引用，在 animal 中查找（自下而上）
// // __proto__ 的值可以是对象，也可以是 null。而其他的类型都会被忽略。
// let animal = {
//     eats: true,
//     walk() {
//         console.log("Animal walk");;
//     }
// };
// let rabbit = {
//     jumps: true,
//     __proto__: animal
// };
// let longEar = {
//     earLength: 10,
//     __proto__: rabbit
// };
// rabbit.__proto__ = animal; // 在这儿我们可以说 “animal 是 rabbit 的原型” 继承
// console.log(animal.eats);


// // walk 方法是从原型中获得的
// // 原型链可以很长
// // 现在，如果我们从 longEar 中读取一些它不存在的内容，JavaScript 会先在 rabbit 中查找，然后在 animal 中查找。
// longEar.walk(); // Animal walk

// 2.内容受保护

// let user = {
//     name: "John",
//     surname: "Smith",

//     set fullName(value) {
//         [this.name, this.surname] = value.split(" ");
//     },

//     get fullName() {
//         return `${this.name} ${this.surname}`;
//     }
// };

// let admin = {
//     __proto__: user,
//     isAdmin: true
// };

// console.log(admin.fullName); // John Smith (*)

// // setter triggers!
// admin.fullName = "Alice Cooper"; // (**)

// console.log((admin.fullName));
// // Alice Cooper，admin 的内容被修改了

// console.log(user.fullName);  // John Smith，user 的内容被保护了不改变
// 3. for..in案例
// let animal = {
//     eats: true
// };

// let rabbit = {
//     jumps: true,
//     __proto__: animal
// };

// // Object.keys 只返回自己的 key
// alert(Object.keys(rabbit)); // jumps

// // for..in 会遍历自己以及继承的键
// for (let prop in rabbit) alert(prop); // jumps，然后是 eats
// 4.hasOwnProperty 查找是否为自己的而不是__proto__继承的
// let animal = {
//     eats: true
// };

// let rabbit = {
//     jumps: true,
//     __proto__: animal
// };

// for (let prop in rabbit) {
//     let isOwn = rabbit.hasOwnProperty(prop);
//     console.log(isOwn);

//     if (isOwn) {
//         console.log(`Our: ${prop}`); // Our: jumps
//     } else {
//         console.log(`Inherited: ${prop}`); // Inherited: eats
//     }
// }
// 5.函数的prototype 每个函数都有prototype
// let animal = {
//     eats: true
// };

// function Rabbit(name) {
//     this.name = name;
// }

// Rabbit.prototype = animal;
// console.log(Rabbit.prototype);
// let rabbit = new Rabbit("White Rabbit"); //  rabbit.__proto__ == animal
// alert(rabbit.name); // true

// 6.构造函数  构造函数在技术上是常规函数。不过有两个约定：

// 它们的命名以大写字母开头。 小写也可以
// 它们只能由 "new" 操作符来执行。
// function User(name) {
//     this.name = name;
//     this.isAdmin = false;
// }
// function Animal(name) {
//     this.name = name;
//     this.isAdmin = false;
// }
// let pig = new Animal('猪');
// console.log(pig.name);

// let user = new User("Jack");
// console.log(user.name);
// console.log(user.isAdmin);


// alert(user.name); // Jack
// alert(user.isAdmin); // false

// 7. new 的执行步骤

// function User(name) {
//   // this = {};（隐式创建）

//   // 添加属性到 this
//   this.name = name;
//   this.isAdmin = false;

//   // return this;（隐式返回）
// }
</script>
<template>
    1
</template>